時鐘對應用程式來說很重要,它可以回答以下問題:
在分散式系統中,時間是一件棘手的事情,因為彼此的溝通可能會延遲且又不曉得延遲多久,更甚者,每台機器在硬體內都有自己的時鐘:石英振盪器 (quartz crystal oscillator),此設備並不完全準確,所以每台機器都有自己的時間概念,這就代表了跟其他機器比起來可能有快有慢。
還好我們可以選擇使用 網路時間協定 (Network Time Protocol) NTP 來同步時鐘。
現代電腦有 2 個類型的時鐘: 單調遞增時鐘 (Monotonic Clock) 和 日曆鐘 (Time-of-Day Clock),區分它們是很重要的,它們有不同的用途。
日曆鐘根據了 壁時計時刻 (wall-clock time) 回傳了掛上該時鐘開始到現在的時間,簡單說就是從 UTC 1970-01-01 開始到現在經過的秒數(或毫秒),不計算閏秒。相關函式有 Linux 的 clock_gettime(CLOCK_REALTIME)
和 Java 的 System.currentTimeMillis()
。
日曆鐘通常會使用 NTP 來同步時間,在特定情形中,如果本地時鐘超過 NTP 伺服器太多,它會強制重置且跳回先前的時間點,因為上述論點以及它們經常忽略閏秒的關係,日曆鐘比較不適合來測量執行時間。
單調遞增時鐘就很適合來測量執行時間或間隔 (interval) 、timeout 或回應時間。它來自於系統啟動後流逝的時間,所以它保證時間會一直往前進,相關函式有 Linux 的 clock_gettime(CLOCK_MONOTONIC)
和 Java 的 System.nanoTime()
。
當 NTP 檢測到電腦的石英移動太快或太慢時,NTP 有可能會調整單調遞增時鐘向前移動的頻率(稱為 slewing the clock),預設是允許時鐘速率加快或減慢 0.05%,但 NTP 不會讓該時鐘往前或往後跳,這個特性讓大多數的系統能將執行時間等等的測量精確到奈秒等級。
乾是 TGI Friday 加上明天要上班所以懶的寫了,剩下的明天補上吧!